From 74e720bb5b86751bd97f9efe3e41f2bde0315420 Mon Sep 17 00:00:00 2001 From: Jay Belanger Date: Wed, 4 Jul 2007 13:53:11 +0000 Subject: [PATCH] (calculator-expt): Use more cases to determine the value. --- lisp/calculator.el | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/lisp/calculator.el b/lisp/calculator.el index c1e0edb6276..b0e3069d3e1 100644 --- a/lisp/calculator.el +++ b/lisp/calculator.el @@ -1793,14 +1793,28 @@ To use this, apply a binary operator (evaluate it), then call this." (expt x y) (domain-error 0.0e+NaN) (range-error - (if (> y 0) - (if (and - (< x 0) - (= y (truncate y)) - (oddp (truncate y))) - -1.0e+INF - 1.0e+INF) - 0.0)) + (cond + ((and (< x 1.0) (> x -1.0)) + ;; For small x, the range error comes from large y. + 0.0) + ((and (> x 0.0) (< y 0.0)) + ;; For large positive x and negative y, the range error + ;; comes from large negative y. + 0.0) + ((and (> x 0.0) (> y 0.0)) + ;; For large positive x and positive y, the range error + ;; comes from large y. + 1.0e+INF) + ;; For the rest, x must be large and negative. + ;; The range errors come from large integer y. + ((< y 0.0) + 0.0) + ((oddp (truncate y)) + ;; If y is odd + -1.0e+INF) + (t + ;; + 1.0e+INF))) (error 0.0e+NaN))) (defun calculator-fact (x) -- 2.30.2